import pymysql

from mysql.hrs import Dept


# 事务的特点是什么? - ACID特性
# 原子性(Atomicity): 不可分割要么全成功要么全失败
# 一致性(Consistency): 事务前后数据状态要保持一致
# 隔离性(Isolation): 多个事务不能看到对方的中间状态(提交或者回滚之前的状态)
# 持久性(Duration): 事务完成后数据要持久化(事务的影响要反映在物理存储上)


def get_conn():
    config = {
        'host': 'localhost',
        'port': 3306,
        'user': 'root',
        'password': 'root',
        'db': 'hrs',
        'charset': 'utf8',
        'autocommit': False,  # 默认不自动提交
        'cursorclass': pymysql.cursors.DictCursor  # 设置游标的类型,查询返回的结果是以字典的方式
    }
    conn = pymysql.connect(**config)
    return conn


def insert():
    """
    插入
    """
    # Connection(连接) / Cursor(游标)
    conn = get_conn()
    try:
        # 创建Cursor对象
        with conn.cursor() as cursor:
            # 向数据库发出sql语句
            # execute返回受影响行数
            dno = input('部门编号:')
            dname = input('部门名称:')
            dloc = input('部门地址:')
            # 如果使用字符串格式化的方式来组装SQL语句
            # 最大的风险是用被SQL注射攻击
            # result = cursor.execute('insert into tbdept values (%s, %s, %s)', (dno, dname, dloc))

            result = cursor.execute(
                'insert into tbdept values (%(dno)s, %(dname)s, %(dloc)s)',
                {'dno': dno, 'dname': dname, 'dloc': dloc}
            )
            print(result)
            conn.commit()
    finally:
        conn.close()


def update():
    """
    修改
    """
    conn = get_conn()
    try:
        with conn.cursor() as cursor:
            dno = input('部门编号:')
            dname = input('部门名称:')
            # 这个方式传参是以字典的方式,但是要注意的是在占位的时候用%(name)s
            result = cursor.execute(
                'update tbdept set dname=%(dname)s where dno=%(dno)s',
                {'dno': dno, 'dname': dname}
            )
            # print('成功插入', cursor.rowcount, '条数据') # 这里cursor.rowcount是获取到受影响的行
            print('成功修改', result, '条数据')
            conn.commit()

    finally:
        conn.close()


def delete(dno):
    """
    根据编号删除
    :param dno: 编号
    """
    # Connection(连接) / Cursor(游标)
    conn = get_conn()
    try:
        # 创建Cursor对象
        with conn.cursor() as cursor:
            # 向数据库发出sql语句
            result = cursor.execute('delete from tbdept where dno=%s', [dno])
            print(result)
            conn.commit()
            # 如果事务中的所有操作全部成功了最后手动提交
            print('删除成功' if result == 1 else '删除失败')
    except Exception as e:
        print(e)
        conn.rollback()
    finally:
        conn.close()


def select():
    """
    查询
    """
    conn = get_conn()
    print(conn)
    try:
        # 创建Cursor对象
        with conn.cursor() as cursor:
            # 向数据库发出sql语句
            cursor.execute('select dno, dname, dloc from tbdept')
            result = cursor.fetchone()
            cursor.rowcount
            while result:
                # 关系型数据库 - 关系模型
                # python程序 - 对象模型
                # ORM - Object Relation Mapping - 对象关系映射
                dept = Dept(**result)
                print(dept.name)
                result = cursor.fetchone()
    finally:
        conn.close()


def main():
    # insert()
    # delete(50)
    # select()
    update()


if __name__ == '__main__':
    main()
